
#ifndef __SIP__UA__HEADER__
#define __SIP__UA__HEADER__


#include "paramconfig.h"
#include "common.h"
#include "sipcore.h"


class SipReg;
class SipCall;

class SipUserAgent : public SipCore
{
public:
    SipUserAgent(ConfigParam& param);
    ~SipUserAgent();

    bool init();
    void uninit();

    bool doRegister();
    void doUnRegister();

    bool send_call(const std::string& targetid);
    void terminate_call(const std::string& reason = "");

    void send_info(const std::string& msg, void* appdata);

    bool sip_send_message_request(const std::string& method, const std::string& contenttype, const std::string& msg);
    bool sip_send_message_answer(int tid, int statuscode, const std::string& contenttype, const std::string& msg);

protected:
    void proc_register_response(const eXosip_event* const osipEvt);
    void proc_call_request(const eXosip_event* const osipEvt);
    void proc_call_response(const eXosip_event* const osipEvt);
    void proc_call_ack(const eXosip_event* const osipEvt);
    void proc_call_cancel(const eXosip_event* const osipEvt);
    void proc_call_message_request(const eXosip_event* const osipEvt);
    void proc_call_message_response(const eXosip_event* const osipEvt);
    void proc_call_close(const eXosip_event* const osipEvt);
    void proc_call_release(const eXosip_event* const osipEvt);
    void proc_new_message(const eXosip_event* const osipEvt);
    void proc_message_response(const eXosip_event* const osipEvt);

    SipReg*     mReg;
    SipCall*    mCall;
};

#endif // #ifndef __SIP__UA__HEADER__